package com.ai.dmc.utils.export.excelhelper;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

/**
 * 页面导出Excel的接口
 * 该接口提供四个方法，分别用于支持不同表头和不同数据组织格式
 * 表头分为简单表头和合并表头，简单表头，即按照顺序单行显示，不存在行合并和列合并
 * 对于合并表头：可以是行合并，也可以是列合并，也可以行列同时合并，合并表头的组织方式要遵循CellBean定义的规则
 * @author majm
 * 
 * huangc 20100425 
 * 	增加两个接口exportExcelByHMWithHeaders，支持将表头和导出字段分开。
 *
 */
public interface IExcelExporter {
	/**
	 * 数据以HashMap的方式组织，即每条记录即为一个HashMap，其中HashMap的key为表头（即key必定为headers中的某一个值），value为与该表头对应的值
	 * 有多少条记录将会有多少个HashMap，而每个HashMap的size必定大于或等于Headers的length
	 * 表头为没有合并单元格的简单表头，显示顺序即为header中数组的存储顺序
	 * 该方法的优点是：适合于动态变化的表头，即当表头的数量变化时，不需重新组织数据记录，可以将数据记录存储所有可能出现的表头及其对应的值
	 * 同时列的顺序调整不需要重新组织数据，完全按照headers的顺序，数据自动调整
	 * 该方法可以有效避免由于数据顺序组织不当，引起的表头与内容列不对应的情况
	 * 该方法的缺点是：需要以HashMap方式组织数据，增加工作量，且多耗内存
	 * @param sheetName：表单标签名称，可以为null或”“，此时将以默认的名字”临时表单“来命名
	 * @param dataset：数据集合，以HashMap方式组织
	 * @param headers：表头，可以为null，当为null时，则取HashMap中所有Key的值作为表头，但顺序并非存储顺序，而是遵循Hash算法的顺序
	 * @param response：页面响应，为了直接向客户端输出生成的表格
	 */
	public void exportExcelByHM(String sheetName, Collection<Map<String,String>> dataset, String[] headers, HttpServletResponse response);
	
	/**
	 * 此接口功能同上，唯一的差别为：表头为具有合并单元格的表头，可以行列分别合并，和行列同时合并
	 * @param sheetName：表单标签名称，可以为null或”“，此时将以默认的名字”临时表单“来命名
	 * @param dataset：数据集合，以HashMap方式组织
	 * @param headerList：以CellBean的方式组织，必须严格按照CellBean的约定来组织该bean，否则会造成表头出现错误
	 * @param response：页面响应，为了直接向客户端输出生成的表格
	 */
	public void exportExcelByHM(String sheetName, Collection<Map<String,String>> dataset, List<CellBean> headerList, HttpServletResponse response);
	
	/**
	 * 功能基本同exportExcelByHM
	 * 不同之处在于：
	 * 	1)表头和导出列的概念分开。表头就是excel中的标题栏，一般为中文描述，比如"地市"。导出列是指需要导出的数据，一般为字段名，比如"cityId"。
	 * 	2)Map建议为支持排序的Map，比如LinkedHashMap、ListOrderedMap等。此时exportColumns指定为null即可。
	 * @param sheetName
	 * @param dataset
	 * @param headers
	 * @param exportColumns
	 * @param response
	 */
	public void exportExcelByHMWithHeaders(String fileName, Collection<Map<String,String>> dataset, String[] headers, String[] exportColumns, HttpServletResponse response);
	
	/**
	 * 2011-08-16 by xufc5 添加单元格格式化功能，新添加方法
	 * 基本功能同exportExcelByHM
	 * 不同之处：添加单元格格式化参数
	 */
	public void exportExcelByHMWithHeaders(String fileName,
			Collection<Map<String, String>> dataset, String[] headers, String[] exportColumns, 
			HttpServletResponse response,String colFmt);
	
	/**
	 * 功能基本同exportExcelByHM
	 * 不同之处在于：
	 * 	1)表头和导出列的概念分开。表头就是excel中的标题栏，一般为中文描述，比如"地市"。导出列是指需要导出的数据，一般为字段名，比如"cityId"。
	 * 	2)Map建议为支持排序的Map，比如LinkedHashMap、ListOrderedMap等。此时exportColumns指定为null即可。
	 * @param sheetName
	 * @param dataset
	 * @param headerList
	 * @param exportColumns
	 * @param response
	 */
	public void exportExcelByHMWithHeaders(String fileName, Collection<Map<String,String>> dataset, List<CellBean> headerList, String[] exportColumns, HttpServletResponse response);
	
	/**
	 * 数据以List的方式组织，即每条记录即为一个List，List中数据的顺序要和Header的顺序一致，否则会造成表头与表体内容的不一致
	 * 该方法优点：组织方便，省内存
	 * 该方法缺点：如果数据组织顺序出现问题，可能会造成数据列与表头不统一
	 * @param sheetName：表单标签名称，可以为null或”“，此时将以默认的名字”临时表单“来命名
	 * @param dataset：数据集合，以List方式组织
	 * @param headers：表头，不能为Null
	 * @param response：页面响应，为了直接向客户端输出生成的表格
	 */
	public void exportExcelByL(String sheetName, Collection<List<String>> dataset, String[] headers, HttpServletResponse response);
	
	/**
	 * 接口功能同上，唯一的差别为：表头为具有合并单元格的表头
	 * @param sheetName：表单标签名称，可以为null或”“，此时将以默认的名字”临时表单“来命名
	 * @param dataset：数据集合，以List方式组织
	 * @param headerList：表头，不能为Null，而且必须按照CellBean的规则要求来组织
	 * @param response：页面响应，为了直接向客户端输出生成的表格
	 */
	public void exportExcelByL(String sheetName, Collection<List<String>> dataset, List<CellBean> headerList, HttpServletResponse response);
	
	/**
	 * 导出多Sheet的Excel，其中SheetLBean需要遵循相应的要求
	 * 数据以List的方式组织，支持单行表头和多行表头混合的多sheet的excel（即某一sheet为单行表头，另一sheet为多行表头）
	 * 每一个SheetLBean即为一个sheet的内容
	 */
	public void exportExcelMSheetByL(String fileName, List<SheetLBean> sheets, HttpServletResponse response);
}
